# language: zh-CN
# 需求ID: REQ-003
# SRS需求: 3.1 DSL解析与领域图, 3.11 模板系统与代码重用
# Feature ID: Epic 1.3
# 用户故事: US-009, US-010, US-011
功能: 领域建模能力
  作为领域专家
  我希望能够通过DSL定义复杂的领域模型和业务规则
  以便准确表达业务逻辑和约束条件

  背景:
    假设我是一个领域专家
    并且我需要定义复杂的业务模型
    并且我使用YAML DSL v2.0语法
    并且系统已经支持基础的实体和属性定义

  # US-009: 作为领域专家，我希望能定义实体间的复杂关联关系
  场景: 定义复杂的实体关联关系
    假设我需要定义订单系统的复杂关系
    当我使用YAML DSL语法定义以下关系:
      """
      entities:
        User:
          fields:
            id: { type: uuid, primary: true }
            name: { type: string, required: true }
          relationships:
            orders:
              type: hasMany
              target: Order
              foreignKey: userId
              cascade: [delete]
            profile:
              type: hasOne
              target: UserProfile
              foreignKey: userId
        
        Order:
          fields:
            id: { type: uuid, primary: true }
            userId: { type: uuid, required: true }
            total: { type: decimal, required: true }
          relationships:
            user:
              type: belongsTo
              target: User
              foreignKey: userId
            items:
              type: hasMany
              target: OrderItem
              foreignKey: orderId
              cascade: [delete]
        
        OrderItem:
          fields:
            id: { type: uuid, primary: true }
            orderId: { type: uuid, required: true }
            productId: { type: uuid, required: true }
            quantity: { type: integer, required: true }
          relationships:
            order:
              type: belongsTo
              target: Order
              foreignKey: orderId
            product:
              type: belongsTo
              target: Product
              foreignKey: productId
      """
    那么系统应该成功解析所有关联关系
    并且应该识别出一对多关系（User->Order, Order->OrderItem）
    并且应该识别出一对一关系（User->UserProfile）
    并且应该识别出多对一关系（Order->User, OrderItem->Order）
    并且应该正确处理级联删除规则
    并且应该验证外键约束的一致性

  # US-010: 作为领域专家，我希望能定义业务规则和约束条件
  场景: 定义业务规则和约束条件
    假设我需要为订单系统定义业务规则
    当我使用YAML DSL语法定义以下业务规则:
      """
      entities:
        Order:
          fields:
            id: { type: uuid, primary: true }
            status: { type: enum, values: [pending, confirmed, shipped, delivered, cancelled] }
            total: { type: decimal, required: true }
            createdAt: { type: datetime, auto: true }
          
          businessRules:
            - name: "订单金额必须大于0"
              condition: "total > 0"
              message: "订单金额必须大于0元"
            
            - name: "已确认订单不能修改金额"
              condition: "status != 'confirmed' OR total == ORIGINAL.total"
              message: "已确认的订单不能修改金额"
            
            - name: "订单状态流转规则"
              condition: |
                (status == 'pending' AND ORIGINAL.status IN ['pending']) OR
                (status == 'confirmed' AND ORIGINAL.status IN ['pending']) OR
                (status == 'shipped' AND ORIGINAL.status IN ['confirmed']) OR
                (status == 'delivered' AND ORIGINAL.status IN ['shipped']) OR
                (status == 'cancelled' AND ORIGINAL.status IN ['pending', 'confirmed'])
              message: "订单状态流转不符合业务规则"
          
          constraints:
            - type: unique
              fields: [orderNumber]
              message: "订单号必须唯一"
            
            - type: check
              condition: "total >= 0"
              message: "订单金额不能为负数"
      """
    那么系统应该成功解析所有业务规则
    并且应该支持条件表达式的验证
    并且应该支持跨字段的约束检查
    并且应该支持状态流转规则的验证
    并且应该在数据操作时自动应用这些规则

  # US-011: 作为领域专家，我希望能定义领域事件和命令
  场景: 定义领域事件和命令
    假设我需要为用户注册流程定义事件和命令
    当我使用YAML DSL语法定义以下领域行为:
      """
      entities:
        User:
          fields:
            id: { type: uuid, primary: true }
            email: { type: string, required: true, unique: true }
            status: { type: enum, values: [pending, active, suspended] }
          
          commands:
            RegisterUser:
              description: "用户注册命令"
              parameters:
                email: { type: string, required: true, format: email }
                password: { type: string, required: true, minLength: 8 }
                name: { type: string, required: true }
              
              preconditions:
                - "NOT EXISTS(User WHERE email == parameters.email)"
              
              effects:
                - action: create
                  entity: User
                  data:
                    email: "parameters.email"
                    name: "parameters.name"
                    status: "pending"
                
                - action: emit
                  event: UserRegistered
                  data:
                    userId: "CREATED.id"
                    email: "parameters.email"
            
            ActivateUser:
              description: "激活用户命令"
              parameters:
                userId: { type: uuid, required: true }
              
              preconditions:
                - "EXISTS(User WHERE id == parameters.userId AND status == 'pending')"
              
              effects:
                - action: update
                  entity: User
                  where: "id == parameters.userId"
                  data:
                    status: "active"
                
                - action: emit
                  event: UserActivated
                  data:
                    userId: "parameters.userId"
          
          events:
            UserRegistered:
              description: "用户注册事件"
              properties:
                userId: { type: uuid, required: true }
                email: { type: string, required: true }
                timestamp: { type: datetime, auto: true }
            
            UserActivated:
              description: "用户激活事件"
              properties:
                userId: { type: uuid, required: true }
                timestamp: { type: datetime, auto: true }
      """
    那么系统应该成功解析命令定义
    并且应该识别命令的参数和前置条件
    并且应该识别命令的执行效果
    并且应该支持事件的自动发布
    并且应该验证命令执行的前置条件
    并且应该支持事件驱动的业务流程

  场景: 验证领域模型的完整性
    假设我定义了完整的订单领域模型
    当系统解析模型定义后
    那么应该验证所有实体关系的一致性
    并且应该验证所有外键约束的有效性
    并且应该验证所有业务规则的语法正确性
    并且应该验证所有命令和事件的定义完整性
    并且应该生成完整的领域模型图
    并且应该提供模型验证报告